﻿using System;
using NUnit.Framework;
using Spring.Context;
using Spring.Context.Support;
using Capa_Negocio.Gestionar_Reservacion;
using Capa_Persistencia_NH;
using Capa_Persistencia_NH.Interface;
using Capa_Dominio;
using Capa_Negocio;

namespace Capa_TestingProyectsNegocios
{
    [TestFixture]
    public class Test_AdministracionReservas
    {
        IApplicationContext Spring = null;
        IAdministrarReservacion Service = null;

        Distrito distritoCreado = null;
        TipoDocumento tipoDocumentoCreado = null;
        Cliente clienteCreado  = null;

        [TestFixtureSetUp]
        public void PrepararPruebas()
        {
            // Inicialización del contenedor de objetos de Spring.NET
            Spring = new XmlApplicationContext(
                "assembly://Estudio7i/Estudio7i/capaPersistencia.xml",
                "assembly://Estudio7i/Estudio7i/capaNegocio.xml"
                );
            // Obtención de la referencia al objeto "administracionSalaEnsayo"
            Service = (IAdministrarReservacion)Spring.GetObject("AdministrarReservacion");

            distritoCreado = ((IDistrito)Spring.GetObject("distritoDAO_NH")).Crear(
               new Distrito() { NombreDistrito="Chorrillos", Estado=true });
            // Creación de un local de pruebas
            tipoDocumentoCreado = ((ITipoDocumento)Spring.GetObject("TipoDocumentoDAO_NH")).Crear(
                new TipoDocumento() { NombreDocumento="DNI", Estado=true });
        }

        [Test]
        public void Test1_Cliente_DatosInsuficientes()
        {
            // Probamos que se lance la excepción porque pasamos "null" en características
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                Service.InscribirCliente(null, "Jhoel", tipoDocumentoCreado.CodigoDocumento, "444444", "one_joel@hotmail.com", Convert.ToDateTime("30/06/1987"), "123", "123", "", distritoCreado.CodigoDistrito, true);
            });
        }

        [Test]
        public void Test2_Cliente_Ok()
        {
            // Probamos que no exista error en la inscripción de la sala
            Assert.DoesNotThrow(delegate
            {
                clienteCreado = Service.InscribirCliente("Perez", "Jhoel", tipoDocumentoCreado.CodigoDocumento, "444444", "one_joel@hotmail.com", Convert.ToDateTime("30/06/1987"), "123", "123", "", distritoCreado.CodigoDistrito, true);
            });
            // Verificamos que la sala inscrita no sea nula
            Assert.IsNotNull(clienteCreado);
            // Verificamos que el código generado para la sala sea mayor que 0
            Assert.Greater(clienteCreado.CodigoCliente, 0);
            // Verificamos que las demás propiedades grabadas sean iguales a las solicitadas
            Assert.AreEqual(clienteCreado.Nombres, "Jhoel");
            Assert.AreEqual(clienteCreado.TipoDocumento.CodigoDocumento, tipoDocumentoCreado.CodigoDocumento);
            Assert.AreEqual(clienteCreado.Distrito.CodigoDistrito, distritoCreado.CodigoDistrito);
        }

        [Test]
        public void Test3_Cliente_Repetido()
        {
            // Probamos que se lance la excepción de sala repetida colocando el mismo nombre y local
            Assert.Catch<EntidadRepetidaException>(delegate
            {
                Service.InscribirCliente("Perez", "Jhoel", tipoDocumentoCreado.CodigoDocumento, "444444", "one_joel@hotmail.com", Convert.ToDateTime("30/06/1987"), "123", "123", "", distritoCreado.CodigoDistrito, true);
            });
        }

        [Test]
        public void Test3_Cliente_EmailRepetido()
        {
            // Probamos que se lance la excepción de sala repetida colocando el mismo nombre y local
            Assert.Catch<EntidadRepetidaException>(delegate
            {
                Service.InscribirCliente("Perez", "Jhoel", tipoDocumentoCreado.CodigoDocumento, "444444", "one_joel@hotmail.com", Convert.ToDateTime("30/06/1987"), "123","123", "", distritoCreado.CodigoDistrito, true);
            });
        }

        [Test]
        public void Test3_Cliente_ClaveNoIgual()
        {
            // Probamos que se lance la excepción de sala repetida colocando el mismo nombre y local
            Assert.Catch<EntidadRepetidaException>(delegate
            {
                Service.InscribirCliente("Perez", "Jhoel", tipoDocumentoCreado.CodigoDocumento, "444444", "one_joel@hotmail.com", Convert.ToDateTime("30/06/1987"), "123", "123", "", distritoCreado.CodigoDistrito, true);
            });
        }
        [TestFixtureTearDown]
        public void FinalizarPruebas()
        {
            ((ICliente)Spring.GetObject("ClienteDAO_NH")).Eliminar(clienteCreado);

            // Eliminamos la sala inscrita
            ((IDistrito)Spring.GetObject("distritoDAO_NH")).Eliminar(distritoCreado);
            // Eliminamos el local de prueba creado inicialmente
            ((ITipoDocumento)Spring.GetObject("TipoDocumentoDAO_NH")).Eliminar(tipoDocumentoCreado);
            // Cerramos el contenedor de Spring
            Spring.Dispose();
            Spring = null;
        }
    }
}
